package me.helllp.book.concurrent.ch03;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 对线程池进行扩展
 * 
 * @author Administrator
 *
 */
public class ExtThreadPool {
	public static class MyTask implements Runnable{
		public String name;
		
		public MyTask(String name) {
			this.name = name;
		}
		
		@Override
		public void run() {
			System.out.println("正在执行: Thrad ID = " + Thread.currentThread().getId() + ", Task Name=" + name);
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		ExecutorService es = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()){
			@Override
			protected void beforeExecute(Thread t, Runnable r) {
				System.out.println("准备执行：" + ((MyTask)r).name);
			}
			
			@Override
			protected void afterExecute(Runnable r, Throwable t) {
				System.out.println("执行完成：" + ((MyTask)r).name);
			}
			
			@Override
			protected void terminated() {
				System.out.println("线程池退出！");
			}
		};
		
		for(int i=0; i<5; i++){
			MyTask task = new MyTask("自定义线程池的任务-"  + i);
			es.execute(task);
			Thread.sleep(10);
		}
		
		es.shutdown();
	}
}
